package xiaolong.zhou.spring_demo.Interceptor;

import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import xiaolong.zhou.spring_demo.Utils.Result;
import xiaolong.zhou.spring_demo.Utils.Token;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class LoginCheck implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //preHandle方法是进行处理器拦截用的，顾名思义，该方法将在Controller处理之前进行调用。
        //SpringMVC中的Interceptor拦截器是链式的，可以同时存在多个Interceptor，
        //然后SpringMVC会根据声明的前后顺序一个接一个的执行，而且所有的Interceptor中的preHandle方法都会在Controller方法调用之前调用。
        //（SpringMVC的这种Interceptor链式结构也是可以进行中断的，这种中断方式是令preHandle的返回值为false，当preHandle的返回值为false的时候整个请求就结束了。）
        if(RequestMethod.OPTIONS.name().equals(request.getMethod())) {
            return true;
        }
        String url = request.getRequestURI().toString();
        if (url.contains("admin/login/login")) {
            return true;
        }
        String token = request.getHeader("token");
        if (token == null || token.trim().isEmpty()) {
            Result result = Result.error("Token invalid");
            String notLogin = JSONObject.toJSONString(result);
            response.getWriter().write(notLogin);
            return  false;
        }
        try {
            Token.paresJWt(token);
        }catch (Exception e){
            Result result = Result.error("Token invalid");
            String notLogin = JSONObject.toJSONString(result);
            response.getWriter().write(notLogin);
            return  false;
        }
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //postHandle是进行处理器拦截用的，它的执行时间是在处理器进行处理之后，也就是在Controller的方法调用之后执行，
        //但是它会在DispatcherServlet进行视图的渲染之前执行，也就是说在这个方法中你可以对ModelAndView进行操作。
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。
        //该方法将在整个请求完成之后，也就是DispatcherServlet渲染了视图执行
    }

}
